package org.asiainfo.flowable.service;

import org.asiainfo.flowable.domain.bo.WfTaskBo;
import org.flowable.bpmn.model.FlowElement;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 工作流任务管理Service接口
 *
 * @author dotor-ww
 */
public interface WfTaskService {

    /**
     * 审核任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void completeTask(WfTaskBo wfTaskBo);

    /**
     * 驳回任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void rejectTask(WfTaskBo wfTaskBo);

    /**
     * 退回任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void returnTask(WfTaskBo wfTaskBo);

    /**
     * 删除任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void deleteTask(WfTaskBo wfTaskBo);

    /**
     * 取消申请
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void stopProcess(WfTaskBo wfTaskBo);

    /**
     * 获取流程任务变量
     *
     * @param taskId 流程任务ID
     * @return 流程任务变量
     */
    Map<String, Object> processVariables(String taskId);

    /**
     * 获取所有可回退节点
     *
     * @param wfTaskBo 流程任务业务对象
     * @return 回退节点
     */
    List<FlowElement> findReturnTaskList(WfTaskBo wfTaskBo);

    /**
     * 认领、签收任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void claim(WfTaskBo wfTaskBo);

    /**
     * 取消认领、签收任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void unClaim(WfTaskBo wfTaskBo);

    /**
     * 委派任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void delegate(WfTaskBo wfTaskBo);

    /**
     * 转办任务
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void transfer(WfTaskBo wfTaskBo);

    /**
     * 撤回流程
     *
     * @param wfTaskBo 流程任务业务对象
     */
    void revokeProcess(WfTaskBo wfTaskBo);

    /**
     * 获取流程图
     *
     * @param processId 流程实例ID
     * @return 流程图
     */
    InputStream diagram(String processId);
}
